/**
 * 服务器重启脚本
 * 
 * 此脚本用于在Windows系统上重启Node.js服务器
 * 会先终止在5000端口运行的进程，然后启动服务器
 */

import { exec } from 'child_process';
import { promisify } from 'util';

const execPromise = promisify(exec);

async function killProcessOnPort(port) {
  try {
    console.log(`尝试终止在端口 ${port} 上运行的进程...`);
    
    // 查找在指定端口上运行的进程
    const { stdout } = await execPromise(`netstat -ano | findstr :${port}`);
    const lines = stdout.split('\n');
    
    for (const line of lines) {
      // 提取PID
      const match = line.match(/(\d+)$/);
      if (match && match[1]) {
        const pid = match[1].trim();
        console.log(`找到在端口 ${port} 上运行的进程，PID: ${pid}`);
        
        // 终止进程
        await execPromise(`taskkill /F /PID ${pid}`);
        console.log(`已终止PID为 ${pid} 的进程`);
      }
    }
    
    console.log(`端口 ${port} 已释放`);
  } catch (error) {
    // 如果没有找到进程或其他错误，只是记录一下
    console.log(`端口 ${port} 上没有运行的进程或无法终止: ${error.message}`);
  }
}

async function startServer() {
  try {
    console.log('正在启动服务器...');
    // 使用node直接启动，不使用npm，避免shell命令问题
    const child = exec('node src/index.js');
    
    // 将子进程的输出流接到当前进程的输出流
    child.stdout.pipe(process.stdout);
    child.stderr.pipe(process.stderr);
    
    console.log('服务器已启动');
  } catch (error) {
    console.error('启动服务器失败:', error);
  }
}

async function main() {
  try {
    // 先终止在端口5000上运行的进程
    await killProcessOnPort(5000);
    
    // 等待一会，确保端口完全释放
    await new Promise(resolve => setTimeout(resolve, 1000));
    
    // 启动服务器
    await startServer();
  } catch (error) {
    console.error('出错了:', error);
  }
}

// 运行主函数
main(); 